package com.cskaoyan.javse.oop2._1extends._7initialization._1notice;

/**
 *
 * 注意:
 *      1.跳转父类构造器,最终一定会跳到Object类的无参构造,最先执行的也是Object类的无参构造器.
 *          它的无参构造器是默认提供的
 *      2.讲构造器时,我们说一个类如果有创建对象的需求,建议顺手给出无参构造
 *          这是因为:
 *              a.子类对象的隐式初始化需要依赖父类的无参构造
 *              b.某些框架在创建对象时,会依赖于类的无参构造
 *      3.构造器的作用是在创建对象过程中,用于给成员变量赋值的,和是否创建对象无关.
 *              所以无论是子类对象的隐式初始化还是显式初始化,虽然它们调用了父类的构造方法,但是不会创建父类对象
 *
 *      4.this(参数)可以表示调用自身的构造器,必须在构造器代码的第一行
 *        super(参数)表示调用父类的构造器,必须在构造器代码的第一行
 *        显然它们是不可能同时存在的.
 *        之所以都必须在第一行,因为如果不在第一行,就隐含super(); 就会导致父类的构造器多次被调用,显然不合理.
 *
 * @since 10:14
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
}

class Animal {
    int age;

    public Animal(int age) {
        this.age = age;
    }

}
// There is no default constructor available in 'com.cskaoyan.javse.oop2._1extends._7initialization._1notice.Animal'
class Dog extends Animal{
    // 1.给Animal加上无参构造
    // 2.子类不再依赖隐式对象初始化,而是直接显式指出,调用父类的单参构造器
    public Dog(){
        // super(); 没有无参构造可以调用
        super(10);
        System.out.println();
    }

    public void test(){
        System.out.println(this);
    }
}